#ifndef WINDOW_H
# define WINDOW_H

# include <string>

namespace	gdl
{
  ////////////////////////////////////////////////////////////
  /// Forward declaration of WindowImpl.
  ////////////////////////////////////////////////////////////
  class WindowImpl;

  ////////////////////////////////////////////////////////////
  /// Forward declaration of InputImpl.
  ////////////////////////////////////////////////////////////
  class InputImpl;

  ////////////////////////////////////////////////////////////
  ///The Window class offert you an OpenGL context.
  ////////////////////////////////////////////////////////////
  class	Window
  {
  public:
    ////////////////////////////////////////////////////////////
    /// Construct Window object with default values.\n
    /// Title		: "Game"\n
    /// Width		: 800\n
    /// Height		: 600\n
    /// Fullscreen mode	: false\n
    ////////////////////////////////////////////////////////////
    Window(void);

    ////////////////////////////////////////////////////////////
    /// Destroy Window object.
    ////////////////////////////////////////////////////////////
    ~Window(void);

    ////////////////////////////////////////////////////////////
    /// Create (or recreate) the Window.
    ////////////////////////////////////////////////////////////
    void		create(void);

    ////////////////////////////////////////////////////////////
    /// Catch the event when the user closes the window.
    ////////////////////////////////////////////////////////////
    void		catchEvent(void);

    ////////////////////////////////////////////////////////////
    /// Display the window on screen.
    ////////////////////////////////////////////////////////////
    void		display(void);

    ////////////////////////////////////////////////////////////
    /// Close the window
    ////////////////////////////////////////////////////////////
    void		close(void);

    ////////////////////////////////////////////////////////////
    /// Tell if the window is open.
    ///
    /// \return If the window is open, true is returned.
    /// Otherwise, false is returned.
    ////////////////////////////////////////////////////////////
    bool		isOpened(void);

    ////////////////////////////////////////////////////////////
    /// Set the title to the window.
    /// Must be called before create method.
    ///
    /// \param[in] title New title.
    ////////////////////////////////////////////////////////////
    void		setTitle(std::string const & title);

    ////////////////////////////////////////////////////////////
    /// Set the width to the window.
    /// Must be called before create method.
    ///
    /// \param[in] width New width.
    ////////////////////////////////////////////////////////////
    void		setWidth(size_t const width);

    ////////////////////////////////////////////////////////////
    /// Set the height to the window.
    /// Must be called before create method.
    ///
    /// \param height New height.
    ////////////////////////////////////////////////////////////
    void		setHeight(size_t const height);

    ////////////////////////////////////////////////////////////
    ///Get the Windows's Width
    ///
    ////////////////////////////////////////////////////////////
    size_t		getWidth()		const;

    ////////////////////////////////////////////////////////////
    ///Get the Windows's Height
    ///
    ////////////////////////////////////////////////////////////
    size_t		getHeight()		const;
    


    ////////////////////////////////////////////////////////////
    /// Set the fullscreen mode to the window.
    ///
    /// \param[in] state True to set the fullscreen mode.
    /// False to set windowed mode.
    ////////////////////////////////////////////////////////////
    void		setFullscreen(bool const state);

    ////////////////////////////////////////////////////////////
    /// Set the cursor at a specified position.
    ///
    /// \param[in] x Position on x-axis (from left)
    /// \param[in] y Position on y-axis (from top)
    ////////////////////////////////////////////////////////////
    void		setCursorAt(unsigned int const x, unsigned int const y);

    ////////////////////////////////////////////////////////////
    /// Show or hide the mouse cursor.
    ///
    /// \param[in] status True to show the cursor.
    /// False to hide it.
    ////////////////////////////////////////////////////////////
    void		showCursor(bool const status);

    ////////////////////////////////////////////////////////////
    /// To reach private members of InputImpl.
    ////////////////////////////////////////////////////////////
    friend class InputImpl;

  private:
    ////////////////////////////////////////////////////////////
    /// Window implementation
    ////////////////////////////////////////////////////////////
    WindowImpl&	window_;
  };
}

#endif /* !WINDOW_H */

